import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 加载数据
file_path = 'D:/pycharm/data/ml-latest-small/tags.csv'
data = pd.read_csv(file_path)
# 2. 查看数据的基本信息
print("数据的基本信息：")
print(data.info())
# 3. 查看数据的前几行
print("\n数据的前几行：")
print(data.head())
# 4. 检查缺失值
print("\n缺失值统计：")
print(data.isnull().sum())
# 5. 处理缺失值
data.dropna(inplace=True)  # 删除含有缺失值的行
# 6. 转换时间戳为可读格式
data['timestamp'] = pd.to_datetime(data['timestamp'], unit='s')
# 7. 查看数据的统计信息
print("\n数据的统计信息：")
print(data.describe())
# 8. 检查重复值
print("\n重复值统计：")
print(data.duplicated().sum())
# 9. 删除重复值（如果有的话）
data.drop_duplicates(inplace=True)
# 10. 查看处理后的数据
print("\n处理后的数据的前几行：")
print(data.head())
# 11. 保存处理后的数据（这部分在目前的数据集里作用不大，后面的实验我会考虑适当修改数据集）
data.to_csv('22551120007.csv', index=False)
# 12. 特征工程
# 计算每个用户的标签数量
user_tag_counts = data.groupby('userId')['tag'].count().reset_index()
user_tag_counts.columns = ['userId', 'tag_count_user']  # 更改列名为 'tag_count_user'
# 计算每部电影的标签数量
movie_tag_counts = data.groupby('movieId')['tag'].count().reset_index()
movie_tag_counts.columns = ['movieId', 'tag_count_movie']  # 更改列名为 'tag_count_movie'
# 计算每个用户的平均标签数量
average_tag_count_per_user = user_tag_counts['tag_count_user'].mean()
print(f"\n每个用户的平均标签数量: {average_tag_count_per_user:.2f}")
# 13. 合并特征
data = data.merge(user_tag_counts, on='userId', how='left')
data = data.merge(movie_tag_counts, on='movieId', how='left')
# 14. 数据分析与可视化
# 标签数量的分布
plt.figure(figsize=(10, 6))
sns.histplot(data['tag_count_user'], bins=30, kde=True)
plt.title('Distribution of Tag Count per User')
plt.xlabel('Tag Count')
plt.ylabel('Frequency')
plt.show()
# 用户活跃度分析
plt.figure(figsize=(10, 6))
sns.histplot(user_tag_counts['tag_count_user'], bins=30, kde=True)
plt.title('Distribution of Tag Count per User')
plt.xlabel('Tag Count')
plt.ylabel('Frequency')
plt.show()
# 查看最常用的标签
top_tags = data['tag'].value_counts().head(10)
plt.figure(figsize=(10, 6))
sns.barplot(x=top_tags.values, y=top_tags.index)
plt.title('Top 10 Tags')
plt.xlabel('Count')
plt.ylabel('Tags')
plt.show()
# 15. 计算每个标签的电影数量
tag_movie_counts = data.groupby('tag')['movieId'].nunique().reset_index()
tag_movie_counts.columns = ['tag', 'movie_count']
# 查看最常用标签的电影数量
top_tags_movies = tag_movie_counts.sort_values(by='movie_count', ascending=False).head(10)
plt.figure(figsize=(10, 6))
sns.barplot(x=top_tags_movies['movie_count'], y=top_tags_movies['tag'])
plt.title('Top 10 Tags by Movie Count')
plt.xlabel('Number of Movies')
plt.ylabel('Tags')
plt.show()
